/*
 * Copyright (c) 2022  by Junzhao
 * THIS FILE IS PART OF JAVASE Song Huongkang PROJECT
 * All Rights Reserved.
 */

package hashcode和equals;
/**
 * @description
 *  在程序运行时，同一个对象多次调用 hashCode() 方法应该返回相同的值。
 *  当两个对象的 equals() 方法比较返回 true 时，这两个对象的 hashCode()
 * 方法的返回值也应相等。
 *  对象中用作 equals() 方法比较的 Field，都应该用来计算 hashCode 值。
 * 以自定义的Customer类为例，何时需要重写equals()？
 *  当一个类有自己特有的“逻辑相等”概念,当改写equals()的时候，总是
 * 要改写hashCode()，根据一个类的equals方法（改写后），两个截然不
 * 同的实例有可能在逻辑上是相等的，但是，根据Object.hashCode()方法，
 * 它们仅仅是两个对象。
 *  因此，违反了“相等的对象必须具有相等的散列码”。
 *  结论：复写equals方法的时候一般都需要同时复写hashCode方法。通
 * 常参与计算hashCode的对象的属性也应该参与到equals()中进行计算。
 * 以Eclipse/IDEA为例，在自定义类中可以调用工具自动重写equals和hashCode。
 * 问题：为什么用Eclipse/IDEA复写hashCode方法，有31这个数字？
 *  选择系数的时候要选择尽量大的系数。因为如果计算出来的hash地址越大，所谓的
 * “冲突”就越少，查找起来效率也会提高。（减少冲突）
 *  并且31只占用5bits,相乘造成数据溢出的概率较小。
 *  31可以 由i*31== (i<<5)-1来表示,现在很多虚拟机里面都有做相关优化。（提高算法效
 * 率）
 *  31是一个素数，素数作用就是如果我用一个数字来乘以这个素数，那么最终出来的结
 * 果只能被素数本身和被乘数还有1来整除！(减少冲突)
 * @author 俊昭
 * @date 2022/4/19
*/
public class HashcodeTest {
    public static void main(String[] args) {

    }
}
